🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / core / barcode / src / main / kotlin / org / meshtastic / core / barcode / BarcodeScannerProvider.kt
Displaying Raw • Download
core/barcode/src/main/kotlin/org/meshtastic/core/barcode/BarcodeScannerProvider.kt bc4e9da3ad7a2a22768cbaecc75810e018bc40e2 (bc4e9da3) Text, 16.81 KB
T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.core.barcode
Tff7b72import T7ee787androidx.camera.compose.CameraXViewfinder
Tff7b72import T7ee787androidx.camera.core.CameraSelector
Tff7b72import T7ee787androidx.camera.core.ImageAnalysis
Tff7b72import T7ee787androidx.camera.core.Preview
Tff7b72import T7ee787androidx.camera.core.SurfaceRequest
Tff7b72import T7ee787androidx.camera.lifecycle.ProcessCameraProvider
Tff7b72import T7ee787androidx.compose.foundation.Canvas
Tff7b72import T7ee787androidx.compose.foundation.layout.Arrangement
Tff7b72import T7ee787androidx.compose.foundation.layout.Box
Tff7b72import T7ee787androidx.compose.foundation.layout.Column
Tff7b72import T7ee787androidx.compose.foundation.layout.Row
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxSize
Tff7b72import T7ee787androidx.compose.foundation.layout.padding
Tff7b72import T7ee787androidx.compose.material3.FilledTonalButton
Tff7b72import T7ee787androidx.compose.material3.Icon
Tff7b72import T7ee787androidx.compose.material3.IconButton
Tff7b72import T7ee787androidx.compose.material3.MaterialTheme
Tff7b72import T7ee787androidx.compose.material3.Surface
Tff7b72import T7ee787androidx.compose.material3.Text
Tff7b72import T7ee787androidx.compose.material3.TextButton
Tff7b72import T7ee787androidx.compose.runtime.Composable
Tff7b72import T7ee787androidx.compose.runtime.DisposableEffect
Tff7b72import T7ee787androidx.compose.runtime.LaunchedEffect
Tff7b72import T7ee787androidx.compose.runtime.getValue
Tff7b72import T7ee787androidx.compose.runtime.key
Tff7b72import T7ee787androidx.compose.runtime.mutableIntStateOf
Tff7b72import T7ee787androidx.compose.runtime.mutableStateOf
Tff7b72import T7ee787androidx.compose.runtime.remember
Tff7b72import T7ee787androidx.compose.runtime.rememberUpdatedState
Tff7b72import T7ee787androidx.compose.runtime.setValue
Tff7b72import T7ee787androidx.compose.ui.Alignment
Tff7b72import T7ee787androidx.compose.ui.Modifier
Tff7b72import T7ee787androidx.compose.ui.geometry.Rect
Tff7b72import T7ee787androidx.compose.ui.graphics.ClipOp
Tff7b72import T7ee787androidx.compose.ui.graphics.Color
Tff7b72import T7ee787androidx.compose.ui.graphics.Path
Tff7b72import T7ee787androidx.compose.ui.graphics.drawscope.Stroke
Tff7b72import T7ee787androidx.compose.ui.graphics.drawscope.clipPath
Tff7b72import T7ee787androidx.compose.ui.platform.LocalContext
Tff7b72import T7ee787androidx.compose.ui.semantics.heading
Tff7b72import T7ee787androidx.compose.ui.semantics.semantics
Tff7b72import T7ee787androidx.compose.ui.unit.dp
Tff7b72import T7ee787androidx.compose.ui.window.Dialog
Tff7b72import T7ee787androidx.compose.ui.window.DialogProperties
Tff7b72import T7ee787androidx.core.content.ContextCompat
Tff7b72import T7ee787androidx.lifecycle.LifecycleOwner
Tff7b72import T7ee787androidx.lifecycle.compose.LocalLifecycleOwner
Tff7b72import T7ee787co.touchlab.kermit.Logger
Tff7b72import T7ee787kotlinx.coroutines.Dispatchers
Tff7b72import T7ee787kotlinx.coroutines.asExecutor
Tff7b72import T7ee787org.jetbrains.compose.resources.stringResource
Tff7b72import T7ee787org.meshtastic.core.resources.Res
Tff7b72import T7ee787org.meshtastic.core.resources.camera_permission
Tff7b72import T7ee787org.meshtastic.core.resources.camera_permission_rationale
Tff7b72import T7ee787org.meshtastic.core.resources.camera_unavailable
Tff7b72import T7ee787org.meshtastic.core.resources.close
Tff7b72import T7ee787org.meshtastic.core.resources.error
Tff7b72import T7ee787org.meshtastic.core.resources.retry
Tff7b72import T7ee787org.meshtastic.core.ui.component.PermissionRecoveryCard
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Close
Tff7b72import T7ee787org.meshtastic.core.ui.icon.MeshtasticIcons
Tff7b72import T7ee787org.meshtastic.core.ui.util.BarcodeScanner
Tff7b72import T7ee787org.meshtastic.core.ui.util.PermissionStatus
Tff7b72import T7ee787org.meshtastic.core.ui.util.rememberCameraPermissionState
Tff7b72import T7ee787java.util.concurrent.CancellationException
Tff7b72import T7ee787java.util.concurrent.ExecutionException
Tff7b72import T7ee787java.util.concurrent.Future
Tff7b72import T7ee787java.util.concurrent.atomic.AtomicBoolean
Tf0883e@Composable
Tff7b72fun Td2a8ffrememberBarcodeScannerTb4b4b4(Te6edf3onResultTb4b4b4: Tb4b4b4(Tffa657String?Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4)Tb4b4b4: Te6edf3BarcodeScanner Tb4b4b4{
Tff7b72var Te6edf3showDialog Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Tff7b72var Te6edf3pendingScan Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Tff7b72var Te6edf3showPermissionRecovery Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3cameraPermission Tff7b72= Te6edf3rememberCameraPermissionStateTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3currentStatus Tff7b72= Te6edf3rememberUpdatedStateTb4b4b4(Te6edf3cameraPermissionTb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3LaunchedEffectTb4b4b4(Te6edf3cameraPermissionTb4b4b4.Te6edf3statusTb4b4b4) Tb4b4b4{
Tff7b72when Tb4b4b4{
T8b949e// A grant arrived for a scan the user asked for — either the pending request or the recovery card's
T8b949e// "Grant"/"Open settings" round-trip. Open the scanner and clear both pending flags.
Te6edf3cameraPermissionTb4b4b4.Te6edf3isGranted Tff7b72&Tff7b72& Tb4b4b4(Te6edf3pendingScan Tff7b72|Tff7b72| Te6edf3showPermissionRecoveryTb4b4b4) Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3showDialog Tff7b72= Tff7b72true
Te6edf3pendingScan Tff7b72= Tff7b72false
Te6edf3showPermissionRecovery Tff7b72= Tff7b72false
Tb4b4b4}
T8b949e// The pending request completed without a grant — surface a recovery card instead of failing silently.
Te6edf3pendingScan Tff7b72&Tff7b72& Te6edf3cameraPermissionTb4b4b4.Te6edf3status Tff7b72!Tff7b72= Te6edf3PermissionStatusTb4b4b4.Te6edf3NOT_REQUESTED Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3showPermissionRecovery Tff7b72= Tff7b72true
Te6edf3pendingScan Tff7b72= Tff7b72false
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3showDialogTb4b4b4) Tb4b4b4{
Te6edf3BarcodeScannerDialogTb4b4b4(
Te6edf3onResult Tff7b72= Tb4b4b4{
Te6edf3showDialog Tff7b72= Tff7b72false
Te6edf3onResultTb4b4b4(Tffa657itTb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3showPermissionRecoveryTb4b4b4) Tb4b4b4{
Te6edf3DialogTb4b4b4(Te6edf3onDismissRequest Tff7b72= Tb4b4b4{ Te6edf3showPermissionRecovery Tff7b72= Tff7b72false Tb4b4b4}Tb4b4b4) Tb4b4b4{
Te6edf3SurfaceTb4b4b4(Te6edf3shape Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3shapesTb4b4b4.Te6edf3largeTb4b4b4, Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3surfaceTb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4, Te6edf3verticalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3spacedByTb4b4b4(T79c0ff1T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
T8b949e// Heading gives screen readers context for the standalone dialog (unlike the in-sheet Compass
T8b949e// card).
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3camera_permissionTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3titleMediumTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3semantics Tb4b4b4{ Te6edf3headingTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Te6edf3PermissionRecoveryCardTb4b4b4(
Te6edf3state Tff7b72= Te6edf3cameraPermissionTb4b4b4,
Te6edf3rationale Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3camera_permission_rationaleTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3remember Tb4b4b4{
Tff7b72object Tb4b4b4: T56d364BarcodeScanner Tb4b4b4{
Tff7b72override Tff7b72fun Td2a8ffstartScanTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72when Tb4b4b4(Te6edf3currentStatusTb4b4b4.Te6edf3valueTb4b4b4) Tb4b4b4{
Te6edf3PermissionStatusTb4b4b4.Te6edf3GRANTED Tff7b72-Tff7b72> Te6edf3showDialog Tff7b72= Tff7b72true
Te6edf3PermissionStatusTb4b4b4.Te6edf3PERMANENTLY_DENIED Tff7b72-Tff7b72> Te6edf3showPermissionRecovery Tff7b72= Tff7b72true
Tff7b72else Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3pendingScan Tff7b72= Tff7b72true
Te6edf3cameraPermissionTb4b4b4.Te6edf3requestTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffBarcodeScannerDialogTb4b4b4(Te6edf3onResultTb4b4b4: Tb4b4b4(Tffa657String?Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Tff7b72var Te6edf3isCameraReady Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Tff7b72var Te6edf3hasCameraError Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Tff7b72var Te6edf3scannerAttempt Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableIntStateOfTb4b4b4(T79c0ff0Tb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3resultGate Tff7b72= Te6edf3remember Tb4b4b4{ Te6edf3SingleScanResultGateTb4b4b4(Tb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3currentOnResult Tff7b72by Te6edf3rememberUpdatedStateTb4b4b4(Te6edf3onResultTb4b4b4)
Tff7b72val Te6edf3context Tff7b72= Te6edf3LocalContextTb4b4b4.Te6edf3current
Tff7b72val Te6edf3mainExecutor Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3contextTb4b4b4) Tb4b4b4{ Te6edf3ContextCompatTb4b4b4.Te6edf3getMainExecutorTb4b4b4(Te6edf3contextTb4b4b4) Tb4b4b4}
Tff7b72fun Td2a8ffdeliverResultTb4b4b4(Te6edf3resultTb4b4b4: Tffa657String?Tb4b4b4) Tb4b4b4{
Te6edf3resultGateTb4b4b4.Te6edf3tryDeliverTb4b4b4(Te6edf3resultTb4b4b4) Tb4b4b4{ Te6edf3value Tff7b72-Tff7b72> Te6edf3mainExecutorTb4b4b4.Te6edf3execute Tb4b4b4{ Te6edf3currentOnResultTb4b4b4(Te6edf3valueTb4b4b4) Tb4b4b4} Tb4b4b4}
Tb4b4b4}
Te6edf3DialogTb4b4b4(Te6edf3onDismissRequest Tff7b72= Tb4b4b4{ Te6edf3deliverResultTb4b4b4(Tff7b72nullTb4b4b4) Tb4b4b4}Tb4b4b4, Te6edf3properties Tff7b72= Te6edf3DialogPropertiesTb4b4b4(Te6edf3usePlatformDefaultWidth Tff7b72= Tff7b72falseTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3BoxTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3keyTb4b4b4(Te6edf3scannerAttemptTb4b4b4) Tb4b4b4{
Te6edf3ScannerViewTb4b4b4(
Te6edf3onResult Tff7b72= Tb4b4b4{ Te6edf3deliverResultTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3onCameraReady Tff7b72= Tb4b4b4{
Te6edf3isCameraReady Tff7b72= Tffa657it
Tff7b72if Tb4b4b4(Tffa657itTb4b4b4) Te6edf3hasCameraError Tff7b72= Tff7b72false
Tb4b4b4}Tb4b4b4,
Te6edf3onCameraError Tff7b72= Tb4b4b4{
Te6edf3isCameraReady Tff7b72= Tff7b72false
Te6edf3hasCameraError Tff7b72= Tff7b72true
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3isCameraReadyTb4b4b4) Tb4b4b4{
Te6edf3ScannerReticuleTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3hasCameraErrorTb4b4b4) Tb4b4b4{
Te6edf3ScannerErrorContentTb4b4b4(
Te6edf3onRetry Tff7b72= Tb4b4b4{
Te6edf3hasCameraError Tff7b72= Tff7b72false
Te6edf3scannerAttemptTff7b72+Tff7b72+
Tb4b4b4}Tb4b4b4,
Te6edf3onClose Tff7b72= Tb4b4b4{ Te6edf3deliverResultTb4b4b4(Tff7b72nullTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3alignTb4b4b4(Te6edf3AlignmentTb4b4b4.Te6edf3CenterTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3IconButtonTb4b4b4(
Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3deliverResultTb4b4b4(Tff7b72nullTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3alignTb4b4b4(Te6edf3AlignmentTb4b4b4.Te6edf3TopStartTb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(
Te6edf3imageVector Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3CloseTb4b4b4,
Te6edf3contentDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3closeTb4b4b4)Tb4b4b4,
Te6edf3tint Tff7b72= Te6edf3ColorTb4b4b4.Te6edf3WhiteTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffScannerErrorContentTb4b4b4(Te6edf3onRetryTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4, Te6edf3onCloseTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4, Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4) Tb4b4b4{
Te6edf3SurfaceTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff2T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4, Te6edf3shape Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3shapesTb4b4b4.Te6edf3largeTb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff2T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3verticalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3spacedByTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3horizontalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterHorizontallyTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3errorTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3titleMediumTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3semantics Tb4b4b4{ Te6edf3headingTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3camera_unavailableTb4b4b4)Tb4b4b4, Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyMediumTb4b4b4)
Te6edf3RowTb4b4b4(Te6edf3horizontalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3spacedByTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3TextButtonTb4b4b4(Te6edf3onClick Tff7b72= Te6edf3onCloseTb4b4b4) Tb4b4b4{ Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3closeTb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3FilledTonalButtonTb4b4b4(Te6edf3onClick Tff7b72= Te6edf3onRetryTb4b4b4) Tb4b4b4{ Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3retryTb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffMagicNumberTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffScannerReticuleTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3CanvasTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3width Tff7b72= Te6edf3sizeTb4b4b4.Te6edf3width
Tff7b72val Te6edf3height Tff7b72= Te6edf3sizeTb4b4b4.Te6edf3height
Tff7b72val Te6edf3reticleSize Tff7b72= Te6edf3widthTb4b4b4.Te6edf3coerceAtMostTb4b4b4(Te6edf3heightTb4b4b4) Tff7b72* T79c0ff0.7f
Tff7b72val Te6edf3left Tff7b72= Tb4b4b4(Te6edf3width Tff7b72- Te6edf3reticleSizeTb4b4b4) Tff7b72/ T79c0ff2
Tff7b72val Te6edf3top Tff7b72= Tb4b4b4(Te6edf3height Tff7b72- Te6edf3reticleSizeTb4b4b4) Tff7b72/ T79c0ff2
Tff7b72val Te6edf3rect Tff7b72= Te6edf3RectTb4b4b4(Te6edf3leftTb4b4b4, Te6edf3topTb4b4b4, Te6edf3left Tff7b72+ Te6edf3reticleSizeTb4b4b4, Te6edf3top Tff7b72+ Te6edf3reticleSizeTb4b4b4)
T8b949e// Draw semi-transparent background with a hole
Te6edf3clipPathTb4b4b4(Te6edf3PathTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{ Te6edf3addRectTb4b4b4(Te6edf3rectTb4b4b4) Tb4b4b4}Tb4b4b4, Te6edf3clipOp Tff7b72= Te6edf3ClipOpTb4b4b4.Te6edf3DifferenceTb4b4b4) Tb4b4b4{
Te6edf3drawRectTb4b4b4(Te6edf3ColorTb4b4b4.Te6edf3BlackTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3alpha Tff7b72= T79c0ff0.6fTb4b4b4)Tb4b4b4)
Tb4b4b4}
T8b949e// Draw reticle corners
Tff7b72val Te6edf3strokeWidth Tff7b72= T79c0ff3.Te6edf3dpTb4b4b4.Te6edf3toPxTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3cornerLength Tff7b72= T79c0ff4T79c0ff0.Te6edf3dpTb4b4b4.Te6edf3toPxTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3color Tff7b72= Te6edf3ColorTb4b4b4.Te6edf3White
T8b949e// Corners
Tff7b72val Te6edf3path Tff7b72=
Te6edf3PathTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
T8b949e// Top Left
Te6edf3moveToTb4b4b4(Te6edf3leftTb4b4b4, Te6edf3top Tff7b72+ Te6edf3cornerLengthTb4b4b4)
Te6edf3lineToTb4b4b4(Te6edf3leftTb4b4b4, Te6edf3topTb4b4b4)
Te6edf3lineToTb4b4b4(Te6edf3left Tff7b72+ Te6edf3cornerLengthTb4b4b4, Te6edf3topTb4b4b4)
T8b949e// Top Right
Te6edf3moveToTb4b4b4(Te6edf3left Tff7b72+ Te6edf3reticleSize Tff7b72- Te6edf3cornerLengthTb4b4b4, Te6edf3topTb4b4b4)
Te6edf3lineToTb4b4b4(Te6edf3left Tff7b72+ Te6edf3reticleSizeTb4b4b4, Te6edf3topTb4b4b4)
Te6edf3lineToTb4b4b4(Te6edf3left Tff7b72+ Te6edf3reticleSizeTb4b4b4, Te6edf3top Tff7b72+ Te6edf3cornerLengthTb4b4b4)
T8b949e// Bottom Right
Te6edf3moveToTb4b4b4(Te6edf3left Tff7b72+ Te6edf3reticleSizeTb4b4b4, Te6edf3top Tff7b72+ Te6edf3reticleSize Tff7b72- Te6edf3cornerLengthTb4b4b4)
Te6edf3lineToTb4b4b4(Te6edf3left Tff7b72+ Te6edf3reticleSizeTb4b4b4, Te6edf3top Tff7b72+ Te6edf3reticleSizeTb4b4b4)
Te6edf3lineToTb4b4b4(Te6edf3left Tff7b72+ Te6edf3reticleSize Tff7b72- Te6edf3cornerLengthTb4b4b4, Te6edf3top Tff7b72+ Te6edf3reticleSizeTb4b4b4)
T8b949e// Bottom Left
Te6edf3moveToTb4b4b4(Te6edf3left Tff7b72+ Te6edf3cornerLengthTb4b4b4, Te6edf3top Tff7b72+ Te6edf3reticleSizeTb4b4b4)
Te6edf3lineToTb4b4b4(Te6edf3leftTb4b4b4, Te6edf3top Tff7b72+ Te6edf3reticleSizeTb4b4b4)
Te6edf3lineToTb4b4b4(Te6edf3leftTb4b4b4, Te6edf3top Tff7b72+ Te6edf3reticleSize Tff7b72- Te6edf3cornerLengthTb4b4b4)
Tb4b4b4}
Te6edf3drawPathTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3colorTb4b4b4, Te6edf3style Tff7b72= Te6edf3StrokeTb4b4b4(Te6edf3strokeWidthTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffScannerViewTb4b4b4(Te6edf3onResultTb4b4b4: Tb4b4b4(Tffa657StringTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4, Te6edf3onCameraReadyTb4b4b4: Tb4b4b4(Tffa657BooleanTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4, Te6edf3onCameraErrorTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3context Tff7b72= Te6edf3LocalContextTb4b4b4.Te6edf3current
Tff7b72val Te6edf3lifecycleOwner Tff7b72= Te6edf3LocalLifecycleOwnerTb4b4b4.Te6edf3current
Tff7b72val Te6edf3cameraExecutor Tff7b72= Te6edf3remember Tb4b4b4{ Te6edf3DispatchersTb4b4b4.Te6edf3DefaultTb4b4b4.Te6edf3asExecutorTb4b4b4(Tb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3currentOnResult Tff7b72by Te6edf3rememberUpdatedStateTb4b4b4(Te6edf3onResultTb4b4b4)
Tff7b72val Te6edf3currentOnCameraReady Tff7b72by Te6edf3rememberUpdatedStateTb4b4b4(Te6edf3onCameraReadyTb4b4b4)
Tff7b72val Te6edf3currentOnCameraError Tff7b72by Te6edf3rememberUpdatedStateTb4b4b4(Te6edf3onCameraErrorTb4b4b4)
Tff7b72val Te6edf3disposed Tff7b72= Te6edf3remember Tb4b4b4{ Te6edf3AtomicBooleanTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3boundCameraProvider Tff7b72= Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTff7b72<Te6edf3ProcessCameraProvider?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3boundPreview Tff7b72= Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTff7b72<Te6edf3Preview?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3boundImageAnalysis Tff7b72= Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTff7b72<Te6edf3ImageAnalysis?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4) Tb4b4b4}
Tff7b72var Te6edf3surfaceRequest Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTff7b72<Te6edf3SurfaceRequest?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4) Tb4b4b4}
Te6edf3DisposableEffectTb4b4b4(Tffa657UnitTb4b4b4) Tb4b4b4{
Te6edf3onDispose Tb4b4b4{
Te6edf3disposedTb4b4b4.Te6edf3setTb4b4b4(Tff7b72trueTb4b4b4)
Te6edf3surfaceRequestTff7b72?.Te6edf3willNotProvideSurfaceTb4b4b4(Tb4b4b4)
Te6edf3surfaceRequest Tff7b72= Tff7b72null
Te6edf3cleanupCameraUseCasesTb4b4b4(
Te6edf3cameraProvider Tff7b72= Te6edf3boundCameraProviderTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3preview Tff7b72= Te6edf3boundPreviewTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3imageAnalysis Tff7b72= Te6edf3boundImageAnalysisTb4b4b4.Te6edf3valueTb4b4b4,
Tb4b4b4)
Te6edf3currentOnCameraReadyTb4b4b4(Tff7b72falseTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3LaunchedEffectTb4b4b4(Tffa657UnitTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3cameraProviderFuture Tff7b72= Te6edf3ProcessCameraProviderTb4b4b4.Te6edf3getInstanceTb4b4b4(Te6edf3contextTb4b4b4)
Te6edf3cameraProviderFutureTb4b4b4.Te6edf3addListenerTb4b4b4(
Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3disposedTb4b4b4.Te6edf3getTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72returnTf0883e@addListener
Tff7b72val Te6edf3cameraProvider Tff7b72= Te6edf3getCameraProviderTb4b4b4(Te6edf3cameraProviderFutureTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3cameraProvider Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3disposedTb4b4b4.Te6edf3getTb4b4b4(Tb4b4b4)Tb4b4b4) Te6edf3currentOnCameraErrorTb4b4b4(Tb4b4b4)
Tff7b72returnTf0883e@addListener
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3disposedTb4b4b4.Te6edf3getTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72returnTf0883e@addListener
Tff7b72val Te6edf3preview Tff7b72= Te6edf3PreviewTb4b4b4.Te6edf3BuilderTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Te6edf3previewTb4b4b4.Te6edf3setSurfaceProvider Tb4b4b4{ Te6edf3request Tff7b72-Tff7b72>
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3disposedTb4b4b4.Te6edf3getTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3surfaceRequest Tff7b72= Te6edf3request
Te6edf3currentOnCameraReadyTb4b4b4(Tff7b72trueTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3requestTb4b4b4.Te6edf3willNotProvideSurfaceTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3imageAnalysis Tff7b72=
Te6edf3ImageAnalysisTb4b4b4.Te6edf3BuilderTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3setBackpressureStrategyTb4b4b4(Te6edf3ImageAnalysisTb4b4b4.Te6edf3STRATEGY_KEEP_ONLY_LATESTTb4b4b4)
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3also Tb4b4b4{ Te6edf3analysis Tff7b72-Tff7b72>
Te6edf3analysisTb4b4b4.Te6edf3setAnalyzerTb4b4b4(Te6edf3cameraExecutorTb4b4b4, Te6edf3createBarcodeAnalyzer Tb4b4b4{ Te6edf3currentOnResultTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3bindCameraUseCasesTb4b4b4(Te6edf3cameraProviderTb4b4b4, Te6edf3lifecycleOwnerTb4b4b4, Te6edf3previewTb4b4b4, Te6edf3imageAnalysisTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3boundCameraProviderTb4b4b4.Te6edf3value Tff7b72= Te6edf3cameraProvider
Te6edf3boundPreviewTb4b4b4.Te6edf3value Tff7b72= Te6edf3preview
Te6edf3boundImageAnalysisTb4b4b4.Te6edf3value Tff7b72= Te6edf3imageAnalysis
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Tff7b72!Te6edf3disposedTb4b4b4.Te6edf3getTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3currentOnCameraReadyTb4b4b4(Tff7b72falseTb4b4b4)
Te6edf3currentOnCameraErrorTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3ContextCompatTb4b4b4.Te6edf3getMainExecutorTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3surfaceRequestTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3CameraXViewfinderTb4b4b4(Te6edf3surfaceRequest Tff7b72= Tffa657itTb4b4b4, Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffcleanupCameraUseCasesTb4b4b4(
Te6edf3cameraProviderTb4b4b4: Te6edf3ProcessCameraProvider?Tb4b4b4,
Te6edf3previewTb4b4b4: Te6edf3Preview?Tb4b4b4,
Te6edf3imageAnalysisTb4b4b4: Te6edf3ImageAnalysis?Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3imageAnalysisTff7b72?.Te6edf3clearAnalyzerTb4b4b4(Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3cameraProvider Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3preview Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3imageAnalysis Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3cameraProviderTb4b4b4.Te6edf3unbindTb4b4b4(Te6edf3previewTb4b4b4, Te6edf3imageAnalysisTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3excTb4b4b4: Te6edf3IllegalStateExceptionTb4b4b4) Tb4b4b4{
Te6edf3logCameraFailureTb4b4b4(Te6edf3excTb4b4b4, Ta5d6ff"Ta5d6ffCamera cleanup failedTa5d6ff"Tb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3excTb4b4b4: Te6edf3IllegalArgumentExceptionTb4b4b4) Tb4b4b4{
Te6edf3logCameraFailureTb4b4b4(Te6edf3excTb4b4b4, Ta5d6ff"Ta5d6ffCamera cleanup failedTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffgetCameraProviderTb4b4b4(Te6edf3cameraProviderFutureTb4b4b4: Te6edf3FutureTff7b72<Te6edf3ProcessCameraProviderTff7b72>Tb4b4b4)Tb4b4b4: Te6edf3ProcessCameraProvider? Tff7b72= Tff7b72try Tb4b4b4{
Te6edf3cameraProviderFutureTb4b4b4.Te6edf3getTb4b4b4(Tb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3excTb4b4b4: Te6edf3CancellationExceptionTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3eTb4b4b4(Te6edf3excTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffCamera provider request was cancelledTa5d6ff" Tb4b4b4}
Tff7b72null
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3excTb4b4b4: Te6edf3ExecutionExceptionTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3eTb4b4b4(Te6edf3excTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffFailed to get camera providerTa5d6ff" Tb4b4b4}
Tff7b72null
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3excTb4b4b4: Te6edf3InterruptedExceptionTb4b4b4) Tb4b4b4{
Te6edf3ThreadTb4b4b4.Te6edf3currentThreadTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3interruptTb4b4b4(Tb4b4b4)
Te6edf3LoggerTb4b4b4.Te6edf3eTb4b4b4(Te6edf3excTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffInterrupted while getting camera providerTa5d6ff" Tb4b4b4}
Tff7b72null
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffbindCameraUseCasesTb4b4b4(
Te6edf3cameraProviderTb4b4b4: Te6edf3ProcessCameraProviderTb4b4b4,
Te6edf3lifecycleOwnerTb4b4b4: Te6edf3LifecycleOwnerTb4b4b4,
Te6edf3previewTb4b4b4: Te6edf3PreviewTb4b4b4,
Te6edf3imageAnalysisTb4b4b4: Te6edf3ImageAnalysisTb4b4b4,
Tb4b4b4)Tb4b4b4: Tffa657Boolean Tff7b72= Tff7b72try Tb4b4b4{
Te6edf3cameraProviderTb4b4b4.Te6edf3bindToLifecycleTb4b4b4(Te6edf3lifecycleOwnerTb4b4b4, Te6edf3CameraSelectorTb4b4b4.Te6edf3DEFAULT_BACK_CAMERATb4b4b4, Te6edf3previewTb4b4b4, Te6edf3imageAnalysisTb4b4b4)
Tff7b72true
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3excTb4b4b4: Te6edf3IllegalStateExceptionTb4b4b4) Tb4b4b4{
Te6edf3imageAnalysisTb4b4b4.Te6edf3handleBindFailureTb4b4b4(Te6edf3excTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3excTb4b4b4: Te6edf3IllegalArgumentExceptionTb4b4b4) Tb4b4b4{
Te6edf3imageAnalysisTb4b4b4.Te6edf3handleBindFailureTb4b4b4(Te6edf3excTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3excTb4b4b4: Te6edf3SecurityExceptionTb4b4b4) Tb4b4b4{
Te6edf3imageAnalysisTb4b4b4.Te6edf3handleBindFailureTb4b4b4(Te6edf3excTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3excTb4b4b4: Te6edf3UnsupportedOperationExceptionTb4b4b4) Tb4b4b4{
Te6edf3imageAnalysisTb4b4b4.Te6edf3handleBindFailureTb4b4b4(Te6edf3excTb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72fun Te6edf3ImageAnalysisTb4b4b4.Td2a8ffhandleBindFailureTb4b4b4(Te6edf3excTb4b4b4: Te6edf3RuntimeExceptionTb4b4b4)Tb4b4b4: Tffa657Boolean Tb4b4b4{
Te6edf3clearAnalyzerTb4b4b4(Tb4b4b4)
Te6edf3logCameraFailureTb4b4b4(Te6edf3excTb4b4b4, Ta5d6ff"Ta5d6ffUse case binding failedTa5d6ff"Tb4b4b4)
Tff7b72return Tff7b72false
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8fflogCameraFailureTb4b4b4(Te6edf3excTb4b4b4: Te6edf3RuntimeExceptionTb4b4b4, Te6edf3messageTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3eTb4b4b4(Te6edf3excTb4b4b4) Tb4b4b4{ Te6edf3message Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.1 - Generated in 0.11s